/*-------------------<-- Start of Description-->---------------------\ | Sort the input data sets according to the variable names and save | | the data to the output data sets correspondingly; | | Note: the outdata cannot be the same as indata, if so, the variable| | names can't be sorted; | |---------------------<-- End of Description-->----------------------| |--------------------------------------------------------------------| |------------<-- Start of Files or Arguments Needed-->---------------| | indata: input dataset names whose variable names need to be sorted;| | outdata: output dataset names you want the sorted data to be saved;| |-------------<-- End of Files or Arguments Needed-->----------------| |--------------------------------------------------------------------| |------------------<-- Start of Files Created-->---------------------| | Example: %sortvnames(indata=acedcrf.implant acedcrf.fwp1, | | outdata=implant fwp1); | | Usage: %sortvnames(indata, outdata); | \-------------------<-- End of Files Created-->---------------------*/ %macro sortvnames/parmbuff; /*--------------------------------------------\ | Copy Right: Duo Zhou; | | Created: 9-6-2001 11:01pm; | | Modified: 12-24-2001 10:35pm; | | Purpose: Sort variable names of datasets; | \--------------------------------------------*/ %local alphaord oriord ndsn indata outdata nin nout _ilme_ indata outdata; %let inbuff=%qscan(&syspbuff,1,%str((),)); %let outbuff=%qscan(&syspbuff,2,%str((),)); %let linesize = %SYSFUNC(GETOPTION(linesize)); %if (%index(%quote(&syspbuff),%quote(=))) %then %do; %if (%index(%quote(&inbuff),%quote(=))) %then %do; %if (%index(%quote(%upcase(%sysfunc(compress(%quote(&inbuff))))),%quote(INDATA=))) %then %do; %let indata=%qscan(&inbuff,2,%str(=)); %if (%index(%quote(&outbuff),%quote(=))) %then %do; %if (not %index(%quote(%upcase(%sysfunc(compress(%quote(&outbuff))))),%quote(OUTDATA=))) %then %do; %put ==> Alert! Keyword parameter "%qscan(&outbuff,1,%str(=))" is not defined!; %end; %else %do; %let outdata=%qscan(&outbuff,2,%str(=)); %end; %end; %else %do; %let outdata=&outbuff; %end; %end; %else %if (%index(%quote(%upcase(%sysfunc(compress(%quote(&inbuff))))),%quote(OUTDATA=))) %then %do; %let outdata=%qscan(&inbuff,2,%str(=)); %if (%index(%quote(&outbuff),%quote(=))) %then %do; %if (not %index(%quote(%upcase(%sysfunc(compress(%quote(&outbuff))))),%quote(INDATA=))) %then %do; %put ==> Alert! Keyword parameter "%qscan(&outbuff,1,%str(=))" is not defined!; %end; %else %do; %let indata=%qscan(&outbuff,2,%str(=)); %end; %end; %else %do; %let indata=&outbuff; %end; %end; %else %put ==> Alert! Keyword parameter "%qscan(&inbuff,1,%str(=))" is not defined!; %end; %else %if (%index(%quote(&outbuff),%quote(=))) %then %do; %if (%index(%quote(%upcase(%sysfunc(compress(%quote(&outbuff))))),%quote(INDATA=))) %then %do; %let indata=%qscan(&outbuff,2,%str(=)); %let outdata=&inbuff; %end; %else %if (%index(%quote(%upcase(%sysfunc(compress(%quote(&outbuff))))),%quote(OUTDATA=))) %then %do; %let indata=&inbuff; %let outdata=%qscan(&outbuff,2,%str(=)); %end; %else %do; %put ==> Alert! Keyword parameter "%qscan(&outbuff,1,%str(=))" is not defined!; %end; %end; %end; %else %do; %let indata=&inbuff; %let outdata=&outbuff; %end; %if (%quote(&indata) ne) %then %do; %if (%quote(&outdata) eq) %then %do; %let outdata=&indata; %end; %let nin=%words(&indata); %let nout=%words(&outdata); %let linesize = %SYSFUNC(GETOPTION(linesize)); %if &nin<&nout %then %do; %put --> Note: The number of your input data (&nin) is less than the number of; %put --> your output data (&nout); %end; %do _ilme_=1 %to &nin; %let indat&_ilme_=%qscan(&indata,1,%str( )); %let outdat&_ilme_=%qscan(&outdata,1,%str( )); %if &&outdat&_ilme_ eq %then %do; %let outdat&_ilme_=&&indat&_ilme_; %end; %if (%sysfunc(exist(&&indat&_ilme_))) %then %do; proc contents noprint data=&&indat&_ilme_ out=_tmpcnt&_ilme_; proc sql noprint; select name into :alphaord separated by ' ' from _tmpcnt&_ilme_ order by upcase(name); select name into :oriord separated by ' ' from _tmpcnt&_ilme_ order by varnum; quit; %put --> All variable names listed in their original order:; %put &oriord..; %put %_repeat('-',&linesize); %put --> All variable names listed in Alphabatic orders:; %put &alphaord..; %put %_repeat('-',&linesize); data &&outdat&_ilme_; retain %upcase(&alphaord); set &&indat&_ilme_; run; proc datasets library=work nolist; delete _tmpcnt&_ilme_; run;quit; %end; %else %do; %put ==> Alert! Please check your input, the data set "&dsn"; %put ==> doesn%str(%')t exist!; %end; %end; %end; %else %do; %put ==> Alert! No data is to be sorted!; %end; %mend sortvnames;